package com.ruoyi.common.core.api.version;

import java.lang.annotation.*;

/**
 * 版本规范说明:
 * 一. 版本兼容性说明:
 * 例1:后端版本只写了版本1.0.0,没有2.0.0和其他版本号, 访问>=1.0.0的任何版本都返回1.0.0
 * 例2:后端没写版本1.0.0, 从2.0.0才开发此接口,后续又增加了2.5.5版本, 前端URL访问2.0.0-2.5.4则使用2.0.0代码; URL访问>=2.5.5则使用2.5.5代码. 注: 前端URL中访问0.0.1-1.9999.9999报404,因后端从2.0.0开始才支持此接口.
 * 例3: 格式1 == 1.0 == 1.0.0==1.0.0.0
 * 例4: 前端不在header中指定版本,默认返回该接口所支持的最新版本.
 * 例5:  2.25.2 > 2.5.2
 * 二.前端和App
 * 接口不用修改,在请求header中增加version, 例如: version:1.0.0, 如果不写版本则返回当前接口的最新版本.
 * 三.后端:
 * 1.后端可在类和方法上都可加注解@ApiVersion, 方法上注解的优先级高于类上的注解, 方法上未加注解则使用类的注解值.
 * 2.后端: 第1位大版本建议加类, 第2位和第3位版本号建议增加方法.
 * (1) 复写的类或方法需保证@RequestMapping中内容一致才可区分版本.
 * (2) 复写类建议采用类继承方式,例如:public class SysApi2 extends SysApi1.
 * (3)没有改动的代码没必要每个版本都增加类和方法,接口机制已保证代码兼容性,建第3条版本号兼容性.
 * (4)方法返回值书写举例:
 * return new ApiResult<String>("2.5.0").setData("getApiName2");
 * return new ApiResult<String>(this.getApiVersion()).setData("getApiName2");
 *
 * return new ApiResult<String>().setData("getApiName2").setApiVersion("2.5.0");
 * return new ApiResult<String>().setData("getApiName2").setApiVersion(this.getApiVersion());
 *
 * @author likun
 */
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ApiVersion {
    public final String V1_0_0 = "1.0.0";
    public final String V2_0_0 = "2.0.0";

    /**
     * api version begin 1
     */
    String value() default "0.0.0";
}
